package com.sky.module.system.utils;

import com.sky.module.system.permission.domain.entity.Permission;
import com.sky.module.system.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/***
 * @description 菜单树工具类
 * @param
 * @return
 * @date 2023/2/20 18:44
 *
 */
public class MenuTree {
    /***
     * @description 根据权限信息 生成树形路由信息
     * @param menuList
     * @param pid 父菜单id
     * @return java.util.List<com.zsg.vo.RouterVo>
     * @date 2023/2/20 18:45
     *
     */
    public static List<RouterVo> makeRouter(List<Permission> menuList, Long pid) {
//            创建集合保存路由信息
        List<RouterVo> routerVoList = new ArrayList<>();
//       判断菜单列表是否为空 ，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
//                筛选不为空的菜单 以及与菜单父id相同 的数据
                .stream().filter(item -> item != null && item.getParentId() == pid)
                .forEach(item -> {
//                    创建路由信息对象
                    RouterVo routerVo = new RouterVo();
                    routerVo.setName(item.getName()); // 路由名称
                    routerVo.setPath(item.getPath()); // 路由地址
//                判断当前菜单是否是一级菜单
                    if (item.getParentId() == 0L) {
                        routerVo.setComponent("Layout"); // 默认是layout 一级菜单
                        routerVo.setAlwaysShow(true);  // 显示路由

                    } else {
                        routerVo.setComponent(item.getUrl()); // 具体的某一个组件
                        routerVo.setAlwaysShow(false); // 将路由折叠
                    }
//                    设置meta 信息
                    RouterVo.Meta meta = new RouterVo.Meta(item.getLabel(), item.getIcon(), item.getCode().split(","));
                    routerVo.setMeta(meta);
                    // 递归生成路由
                    List<RouterVo> children = makeRouter(menuList, item.getId()); // 子菜单
                    routerVo.setChildren(children);  //设置子路由到路由对象中
//                                     将路由信息添加到集合中
                    routerVoList.add(routerVo);

                });
        return routerVoList;
    }

    /***
     * @description 生成菜单树
     * @param menuList
     * @param pid
     * @return java.util.List<com.zsg.entity.Permission>
     * @date 2023/2/20 19:14
     *
     */
    public static List<Permission> makeMenuTree(List<Permission> menuList, Long pid) {
//         创建集合保存 菜单树
        List<Permission> permissionList = new ArrayList<>();
//            pid =0
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
//                当前循环的元素的父亲id和传进来pid相同
                .stream().filter(item -> item != null && item.getParentId() == pid)
                .forEach(item -> {
//                            创建是权限菜单对象
                    Permission permission = new Permission();
//                     将原有的属性复制给菜单对象
                    BeanUtils.copyProperties(item, permission);
//                    获取每一个item 对象的子菜单  递归生成菜单树
//                     只要知道这个方法，能够获取到子数据
                    List<Permission> children = makeMenuTree(menuList, item.getId());
                    permission.setChildren(children);
                    permissionList.add(permission);
                });


        return permissionList;
    }
}
